package bytes;

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;

public final class FileHelper {
	
	/**
	 * 将第一个参数传入的文件拆分后依次序存储到第二个参数对应的目录下
	 * @param file 被拆分的源文件
	 * @param path 拆分后的问价存储路径
	 * @param size 表示每个小文件的最大体积
	 */
	public static void split( File file , File path , int size ) throws IOException {
		
		if( !file.exists() || !file.isFile() ) {
			throw new IllegalArgumentException( "被拆分的文件不存在" );
		}
		
		if( !path.exists() || !path.isDirectory() ) {
			throw new IllegalArgumentException( "目标位置不存在或不有效目录" );
		}
		
		// 获取文件体积
		final long length = file.length(); 
		// 获取原文件名
		final String name = file.getName();
		
		String prefix = "" ;
		String suffix = "" ;
		
		int index = name.indexOf( "." );
		if( index > 0 ) {
			prefix = name.substring( 0 , index );
			suffix = name.substring( index );
		} else {
			prefix = name ;
		}
		
		// 统计拆分后的文件数
		long n = length / size;
		if( length % size != 0 ) {
			n++ ; 
		}
		
		InputStream in = new FileInputStream( file );
		
		final byte[] bytes = new byte[ size ];
		
		for( int i = 1 ; i <= n ; i++ ) {
			// 暂时不考虑 n > 99 的情况
			String filename = prefix + "#" + ( i < 10 ? ( "0" + i ) : i ) + suffix ;
			
			int x = in.read( bytes ); // 从 字节输入流 中读取数据到 bytes 数组中并返回实际读取到的有效字节数
			
			File dest = new File( path , filename );
			OutputStream out = new FileOutputStream( dest );
			out.write( bytes ,  0 , x ); // 将 bytes 数组中 [ 0 , x ) 之间的字节写入到输出流中
			out.close();
		}
		
		// 从 file 所表示的文件中读取数据，每次读取 50MB ，写出到一个新文件中
		// 假设大文件名称为 阿凡达.mp4 ( 1576MB ) ，则拆分后的文件为 "阿凡达01" 、 "阿凡达02" ...
		
		in.close();
		
	}
	
	/**
	 * 将第一个参数传入的目录中有序的文件合并到一个大文件( 第二个参数表示合并后的文件的存储位置 )
	 * @param path 依次序存放了一批等待合并的小文件的目录
	 * @param dest 合并之后的大文件的存储路径
	 */
	public static void join( File path , File dest ) {
		
		if( !path.exists() || !path.isDirectory() ) {
			throw new IllegalArgumentException( "目录不存在或不有效目录" );
		}
		
		File destParent = dest.getParentFile();
		
		if( !destParent.exists() || !destParent.canWrite() ) {
			throw new IllegalArgumentException( "目标位置的父目录不存在" );
		}
		
		FileFilter fileFilter = new FileFilter() {
			@Override
			public boolean accept(File pathname) {
				return pathname.isFile() ;
			}
		};
		
		File[] files = path.listFiles( fileFilter ); // 可以考虑使用 FileFilter 对文件进行过滤
		System.out.println( Arrays.toString( files ) );
		
		// 使用 比较器 对 files 数组中的元素按照 文件名称进行排序
		
		// 排序之后再考虑合并
		
	}

}
